// 安全审查和防护配置文件
// 定义应用的安全策略、防护措施和最佳实践

// CORS（跨域资源共享）配置
export const corsConfig = {
  // 是否启用CORS
  enabled: true,
  
  // 允许的源
  allowedOrigins: [
    'http://localhost:8080',
    'http://localhost:3000',
    'https://starmate.app',
    'https://www.starmate.app'
  ],
  
  // 是否允许所有源（开发环境可以使用）
  allowAllOrigins: process.env.NODE_ENV === 'development',
  
  // 允许的HTTP方法
  allowedMethods: [
    'GET',
    'POST',
    'PUT',
    'DELETE',
    'OPTIONS',
    'PATCH',
    'HEAD'
  ],
  
  // 允许的HTTP头
  allowedHeaders: [
    'Content-Type',
    'Authorization',
    'X-Requested-With',
    'Accept',
    'Origin',
    'X-CSRF-Token',
    'X-XSRF-TOKEN',
    'Access-Control-Allow-Origin'
  ],
  
  // 是否允许凭证
  allowCredentials: true,
  
  // 预检请求的缓存时间（秒）
  maxAge: 86400,
  
  // 暴露的响应头
  exposedHeaders: [
    'Content-Length',
    'X-Content-Type-Options',
    'X-Frame-Options',
    'X-XSS-Protection'
  ]
};

// CSRF（跨站请求伪造）防护配置
export const csrfConfig = {
  // 是否启用CSRF防护
  enabled: true,
  
  // CSRF令牌名称
  tokenName: 'X-CSRF-Token',
  
  // Cookie名称
  cookieName: 'XSRF-TOKEN',
  
  // CSRF令牌长度
  tokenLength: 32,
  
  // 令牌过期时间（秒）
  tokenExpiry: 3600,
  
  // 忽略的路由（不进行CSRF验证）
  ignoredRoutes: [
    '/api/auth/login',
    '/api/auth/logout',
    '/api/auth/register',
    '/api/public/*'
  ],
  
  // 忽略的HTTP方法
  ignoredMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE'],
  
  // 是否在响应头中包含令牌
  exposeTokenInHeader: true,
  
  // 是否在cookie中设置安全标志
  cookieSecure: process.env.NODE_ENV === 'production',
  
  // 是否在cookie中设置httpOnly标志
  cookieHttpOnly: true,
  
  // 是否在cookie中设置sameSite标志
  cookieSameSite: 'strict' // 'strict' | 'lax' | 'none'
};

// XSS（跨站脚本攻击）防护配置
export const xssConfig = {
  // 是否启用XSS防护
  enabled: true,
  
  // 是否启用内容安全策略
  contentSecurityPolicy: true,
  
  // 是否启用X-XSS-Protection头部
  xssProtectionHeader: true,
  
  // 是否启用X-Content-Type-Options头部
  contentTypeOptions: true,
  
  // 是否启用X-Frame-Options头部
  frameOptions: true,
  
  // 允许的框架祖先
  frameAncestors: [
    'self'
  ],
  
  // 允许的脚本来源
  scriptSrc: [
    'self',
    'https://apis.google.com',
    'https://www.googletagmanager.com',
    'https://cdn.jsdelivr.net',
    'https://unpkg.com'
  ],
  
  // 允许的样式来源
  styleSrc: [
    'self',
    'unsafe-inline', // 临时允许内联样式，生产环境应移除
    'https://cdn.jsdelivr.net',
    'https://unpkg.com'
  ],
  
  // 允许的图片来源
  imgSrc: [
    'self',
    'data:',
    'https://*.googleapis.com',
    'https://*.gstatic.com'
  ],
  
  // 允许的字体来源
  fontSrc: [
    'self',
    'https://fonts.gstatic.com',
    'https://cdn.jsdelivr.net',
    'https://unpkg.com'
  ],
  
  // 允许的连接来源
  connectSrc: [
    'self',
    'https://api.starmate.app',
    'https://analytics.starmate.app'
  ],
  
  // 允许的表单提交目标
  formAction: [
    'self'
  ],
  
  // 允许的对象来源
  objectSrc: [
    'none' // 不允许任何插件
  ],
  
  // 允许的媒体来源
  mediaSrc: [
    'self',
    'data:'
  ],
  
  // 允许的worker来源
  workerSrc: [
    'self'
  ],
  
  // 允许的frame来源
  frameSrc: [
    'none' // 不允许任何frame
  ],
  
  // 是否阻止内联事件处理程序
  disallowInlineHandlers: true,
  
  // 是否阻止eval()和相关函数
  disallowEval: true
};

// 数据验证配置
export const validationConfig = {
  // 是否启用客户端验证
  clientSideValidation: true,
  
  // 是否启用服务器端验证
  serverSideValidation: true,
  
  // 密码强度要求
  passwordRequirements: {
    // 最小长度
    minLength: 8,
    
    // 是否需要大写字母
    requireUppercase: true,
    
    // 是否需要小写字母
    requireLowercase: true,
    
    // 是否需要数字
    requireNumbers: true,
    
    // 是否需要特殊字符
    requireSpecialChars: true,
    
    // 特殊字符列表
    specialChars: '!@#$%^&*()-_=+[]{}|;:,.<>?',
    
    // 不允许的密码（常见密码）
    disallowedPasswords: [
     
      'password',
      '12345678',
      'qwerty',
      '123456789',
      '12345',
      '1234',
      '111111',
      '1234567',
      'dragon',
      '123123',
      'baseball',
      'abc123',
      'football',
      'monkey',
      'letmein',
      '696969',
      'shadow',
      'master',
      '666666',
      'qwertyuiop',
      '123321',
      'mustang',
      '1234567890',
      'michael',
      '654321',
      'superman',
      '1qaz2wsx',
      '7777777',
      'fuckyou',
      'fuck',
      '121212',
      '000000',
      'qazwsxedc',
      '123qwe',
      'killer',
      'trustno1',
      'jordan',
      'jennifer',
      'zxcvbnm',
      'asdfgh',
      'hunter',
      'buster',
      'soccer',
      'harley',
      'batman',
      'andrew',
      'tigger',
      'sunshine',
      'iloveyou',
      '2000',
      'charlie',
      'robert',
      'thomas',
      'hockey',
      'ranger',
      'daniel',
      'starwars',
      'klaster',
      '1122',
      'george',
      'computer',
      'michelle',
      'jessica',
      'pepper',
      '1111',
      'zxcvbn',
      '555555',
      '11111111',
      '131313',
      'freedom',
      '777777',
      'pass',
      'maggie',
      'princess',
      'nicole',
      'chelsea',
      'bitch',
      '123123',
      'jasmine',
      'william',
      'samantha',
      'rosie',
      'chicken',
      'david',
      'morgan',
      'marina',
      'james',
      'victoria',
      'emily',
      'dakota',
      'cat',
      'dog',
      'pussy',
      'rachel',
      'cunt',
      'christopher',
      'sarah',
      'hannah',
      'mike',
      'brandon',
      'oliver',
      'patricia',
      'ashley',
      'samuel',
      'jackson',
      'madison',
      'benjamin',
      'leo',
      'amelia',
      'harper',
      'elizabeth',
      'alexander',
      'sophia',
      'jacob',
      'ava',
      'willow',
      'amelie',
      'chloe',
      'grace',
      'henry',
      'dylan',
      'noah',
      'olivia',
      'emma',
      'lucas',
      'ava',
      'aiden',
      'isabella',
      'ethan',
      'sophia',
      'logan',
      'olivia',
      'joshua',
      'emma',
      'grayson',
      'isabella',
      'jacob',
      'mia',
      'jack',
      'ava',
      'elijah',
      'amelia',
      'benjamin',
      'sophia',
      'alexander',
      'olivia',
      'william',
      'emma'
    ],
    
    // 是否检查密码是否包含用户名
    checkUsernameInPassword: true,
    
    // 是否检查密码历史
    checkPasswordHistory: true,
    
    // 密码历史记录数量
    passwordHistoryCount: 3
  },
  
  // 输入验证规则
  inputRules: {
    // 是否清理输入
    sanitizeInput: true,
    
    // 是否移除HTML标签
    removeHtmlTags: true,
    
    // 是否转义特殊字符
    escapeSpecialChars: true,
    
    // 最大输入长度
    maxInputLength: 1000,
    
    // 是否限制输入字符集
    restrictInputChars: true,
    
    // 允许的字符集（正则表达式）
    allowedCharsPattern: /^[a-zA-Z0-9\s\u4e00-\u9fa5!@#$%^&*()_+\-=\[\]{}|;':",./<>?]*$/u
  }
};

// 会话安全配置
export const sessionSecurity = {
  // 是否启用安全会话
  enabled: true,
  
  // 会话超时时间（秒）
  sessionTimeout: 3600, // 1小时
  
  // 活动会话超时警告（秒）
  sessionTimeoutWarning: 300, // 5分钟
  
  // 是否在不活动时超时
  timeoutOnInactivity: true,
  
  // 最大并发会话数
  maxConcurrentSessions: 3,
  
  // 是否在新设备登录时通知
  notifyOnNewDeviceLogin: true,
  
  // 是否在会话过期后自动登出
  autoLogoutOnExpiry: true,
  
  // 是否在多个设备登录时终止旧会话
  terminateOldSessions: true,
  
  // 是否跟踪会话IP变化
  trackIpChanges: true,
  
  // 是否在IP变化时要求重新验证
  requireReauthenticationOnIpChange: false
};

// 认证安全配置
export const authSecurity = {
  // 是否启用多因素认证
  mfaEnabled: true,
  
  // 支持的MFA方法
  mfaMethods: [
    'email',
    'sms',
    'authenticator_app'
  ],
  
  // 默认MFA方法
  defaultMfaMethod: 'email',
  
  // MFA验证码长度
  mfaCodeLength: 6,
  
  // MFA验证码过期时间（秒）
  mfaCodeExpiry: 300, // 5分钟
  
  // 登录失败限制
  loginFailureLimit: {
    // 最大失败次数
    maxAttempts: 5,
    
    // 锁定时间（秒）
    lockoutTime: 1800, // 30分钟
    
    // 是否在锁定时通知
    notifyOnLockout: true,
    
    // 是否记录失败尝试
    logFailedAttempts: true
  },
  
  // 令牌安全配置
  tokenSecurity: {
    // JWT密钥长度
    keyLength: 256,
    
    // 访问令牌过期时间（秒）
    accessTokenExpiry: 3600, // 1小时
    
    // 刷新令牌过期时间（秒）
    refreshTokenExpiry: 2592000, // 30天
    
    // 是否轮换刷新令牌
    rotateRefreshToken: true,
    
    // 是否在令牌中包含IP信息
    includeIpInToken: true,
    
    // 是否在令牌中包含设备信息
    includeDeviceInfo: true
  },
  
  // 密码重置配置
  passwordReset: {
    // 重置链接过期时间（秒）
    resetTokenExpiry: 3600, // 1小时
    
    // 是否要求不同于旧密码
    requireDifferentFromOld: true,
    
    // 是否在重置成功后通知
    notifyOnSuccess: true,
    
    // 是否在请求重置时通知
    notifyOnRequest: true
  }
};

// 数据安全配置
export const dataSecurity = {
  // 是否启用数据加密
  encryptionEnabled: true,
  
  // 加密算法
  encryptionAlgorithm: 'AES-256-GCM',
  
  // 是否使用HMAC
  useHmac: true,
  
  // HMAC算法
  hmacAlgorithm: 'SHA-256',
  
  // 敏感数据字段（需要加密）
  sensitiveFields: [
    'password',
    'credit_card',
    'social_security_number',
    'phone_number',
    'address',
    'date_of_birth'
  ],
  
  // 是否在日志中脱敏
  maskSensitiveDataInLogs: true,
  
  // 数据备份配置
  backupConfig: {
    // 是否启用备份
    enabled: true,
    
    // 备份频率（秒）
    frequency: 86400, // 每天
    
    // 备份保留天数
    retentionDays: 30,
    
    // 是否加密备份
    encryptBackups: true
  },
  
  // 数据传输安全
  dataTransmission: {
    // 是否要求HTTPS
    requireHttps: process.env.NODE_ENV === 'production',
    
    // 是否使用安全cookie
    secureCookies: process.env.NODE_ENV === 'production',
    
    // 是否使用HTTP/2
    http2Enabled: true,
    
    // 是否支持HTTP/3
    http3Enabled: false,
    
    // TLS版本要求
    minTlsVersion: 'TLSv1.2'
  }
};

// 权限控制配置
export const permissionConfig = {
  // 是否启用基于角色的访问控制
  rbacEnabled: true,
  
  // 是否启用基于属性的访问控制
  abacEnabled: false,
  
  // 默认角色
  defaultRole: 'user',
  
  // 角色列表
  roles: [
    'admin',
    'moderator',
    'user',
    'guest'
  ],
  
  // 权限列表
  permissions: [
    // 用户管理权限
    'user:read',
    'user:write',
    'user:delete',
    'user:admin',
    
    // 内容管理权限
    'content:read',
    'content:write',
    'content:delete',
    'content:publish',
    
    // 学习管理权限
    'learning:read',
    'learning:write',
    'learning:delete',
    'learning:admin',
    
    // 系统管理权限
    'system:read',
    'system:write',
    'system:admin',
    'system:backup',
    'system:restore',
    
    // 统计权限
    'stats:read',
    'stats:export',
    
    // 安全管理权限
    'security:read',
    'security:write',
    'security:audit'
  ],
  
  // 角色权限映射
  rolePermissions: {
    admin: ['*'], // 所有权限
    moderator: [
      'user:read',
      'content:read',
      'content:write',
      'content:publish',
      'learning:read',
      'stats:read'
    ],
    user: [
      'user:read',
      'user:write',
      'content:read',
      'learning:read',
      'learning:write',
      'stats:read'
    ],
    guest: [
      'content:read'
    ]
  },
  
  // 是否启用权限检查日志
  logPermissionChecks: false,
  
  // 是否在权限检查失败时抛出异常
  throwOnPermissionFailure: true,
  
  // 是否在权限检查失败时记录
  logPermissionFailures: true
};

// 安全审计配置
export const auditConfig = {
  // 是否启用安全审计
  enabled: true,
  
  // 审计日志级别
  logLevel: 'info', // 'debug', 'info', 'warn', 'error'
  
  // 记录用户活动
  logUserActivity: true,
  
  // 记录系统事件
  logSystemEvents: true,
  
  // 记录安全事件
  logSecurityEvents: true,
  
  // 记录数据变更
  logDataChanges: true,
  
  // 审计日志保留天数
  retentionDays: 90,
  
  // 是否加密审计日志
  encryptAuditLogs: true,
  
  // 是否实时监控
  realTimeMonitoring: true,
  
  // 是否发送安全警报
  sendSecurityAlerts: true,
  
  // 安全警报阈值
  alertThresholds: {
    // 登录失败阈值
    loginFailures: 5,
    
    // 敏感操作频率阈值
    sensitiveOperationsPerMinute: 20,
    
    // 异常访问模式检测
    enableAnomalyDetection: true
  }
};

// 安全扫描配置
export const securityScanConfig = {
  // 是否启用定期安全扫描
  enabled: true,
  
  // 扫描频率（秒）
  scanFrequency: 604800, // 每周
  
  // 扫描类型
  scanTypes: [
    'dependency_vulnerabilities',
    'code_quality',
    'security_issues',
    'secret_detection',
    'license_compliance'
  ],
  
  // 依赖扫描配置
  dependencyScan: {
    // 是否启用
    enabled: true,
    
    // 是否自动更新依赖
    autoUpdate: false,
    
    // 严重漏洞阈值
    criticalVulnerabilityThreshold: 0,
    
    // 高风险漏洞阈值
    highVulnerabilityThreshold: 2
  },
  
  // 代码质量扫描配置
  codeQualityScan: {
    // 是否启用
    enabled: true,
    
    // 最大严重问题数
    maxCriticalIssues: 5,
    
    // 最大高风险问题数
    maxHighIssues: 10
  },
  
  // 安全问题扫描配置
  securityIssuesScan: {
    // 是否启用
    enabled: true,
    
    // 检查SQL注入
    checkSqlInjection: true,
    
    // 检查XSS
    checkXss: true,
    
    // 检查CSRF
    checkCsrf: true,
    
    // 检查命令注入
    checkCommandInjection: true,
    
    // 检查路径遍历
    checkPathTraversal: true
  },
  
  // 密钥检测配置
  secretDetection: {
    // 是否启用
    enabled: true,
    
    // 检测的密钥类型
    secretTypes: [
      'api_keys',
      'passwords',
      'certificates',
      'private_keys',
      'tokens'
    ]
  }
};

// 合并所有配置
export const securityConfig = {
  cors: corsConfig,
  csrf: csrfConfig,
  xss: xssConfig,
  validation: validationConfig,
  session: sessionSecurity,
  auth: authSecurity,
  data: dataSecurity,
  permissions: permissionConfig,
  audit: auditConfig,
  scan: securityScanConfig
};

// 根据环境覆盖配置
export const getSecurityConfig = () => {
  // 基础配置
  const config = { ...securityConfig };
  
  // 生产环境安全增强
  if (process.env.NODE_ENV === 'production') {
    // 禁用不安全的CORS
    config.cors.allowAllOrigins = false;
    
    // 启用严格的XSS保护
    config.xss.contentSecurityPolicy = true;
    config.xss.xssProtectionHeader = true;
    config.xss.disallowInlineHandlers = true;
    config.xss.disallowEval = true;
    
    // 加强密码要求
    config.validation.passwordRequirements.minLength = 10;
    
    // 加强会话安全
    config.session.sessionTimeout = 1800; // 30分钟
    config.session.maxConcurrentSessions = 2;
    
    // 启用HTTPS要求
    config.data.dataTransmission.requireHttps = true;
    config.data.dataTransmission.secureCookies = true;
    
    // 启用安全审计
    config.audit.enabled = true;
    config.audit.logLevel = 'info';
  } else {
    // 开发环境配置
    config.cors.allowAllOrigins = true;
    config.xss.contentSecurityPolicy = false; // 开发环境禁用CSP，方便调试
    config.validation.passwordRequirements.minLength = 6; // 开发环境降低密码要求
    config.audit.logLevel = 'debug'; // 开发环境记录详细日志
  }
  
  return config;
};

// 导出默认配置
export default securityConfig;